package com.execjar.utils;

import org.apache.commons.lang.StringUtils;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;

/**
 * @author tzt
 */
public class HexStrConvers {

    private static String hexString = "0123456789ABCDEF";

    /**
     * 16进制的字符串表示转成ASCII字节数组
     *
     * @param hexStr 16进制格式的字符串
     * @return 转换后的字节数组
     **/
    public static byte[] toByteArray2(String hexStr) {
        if (StringUtils.isNotBlank(hexStr)) {
            hexStr = hexStr.replace(" ", "");
            char[] hexChars = hexStr.toCharArray();
            byte[] bytes = new byte[hexChars.length >> 1];
            for (int i = 0; i < bytes.length; i++) {
                bytes[i] = (byte) Integer.parseInt("" + hexChars[i * 2] + hexChars[i * 2 + 1], 16);
            }
            return bytes;
        }
        return null;
    }

    /**
     * byte数组 转成16进制字符串
     *
     * @param bytes
     * @return 去除了空格的大写
     */
    public static String byteArrToHexStr(byte[] bytes) {
        final BigInteger bigInteger = new BigInteger(1, bytes);
        return bigInteger.toString(16).toUpperCase();
    }

    /**
     * byte数组 转成16进制字符串
     *
     * @return String 每个Byte值之间空格分隔,并且是大写
     */
    public static String byte2HexStr(byte[] b) {
        String stmp;
        StringBuilder sb = new StringBuilder("");
        for (int n = 0; n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0xFF);
            sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
            sb.append(" ");
        }
        return sb.toString().toUpperCase().trim();
    }

    /**
     * 16进制字符串转byte数组
     *
     * @param s 16进制字符串
     * @return byte数组
     */
    public static byte[] hexStringToBytes(String s) {
        int len = s.length();
        byte[] b = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            // 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个字节
            b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
                    .digit(s.charAt(i + 1), 16));
        }
        return b;
    }


    /*
     * 将字符串编码成16进制数字,适用于所有字符（包括中文）
     */
    public static String encode(String str) throws UnsupportedEncodingException {
        // 根据默认编码获取字节数组
        return encodeEncoding(str, "GBK");
    }

    /*
     * 将字符串编码成16进制数字,适用于所有字符（包括中文）
     */
    public static String encodeEncoding(String str, String encoding)
            throws UnsupportedEncodingException {
        // 根据默认编码获取字节数组
        byte[] bytes = str.getBytes(encoding);
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        // 将字节数组中每个字节拆解成2位16进制整数
        for (int i = 0; i < bytes.length; i++) {
            sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
            sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
            sb.append(" ");
        }
        return sb.toString();
    }
}
